// internal/parser/parser/update.go
package parser

import (
	"fmt"

	"NumberBase/internal/parser/ast"
	"NumberBase/internal/parser/lexer"
)

// parseUpdateStatement 解析UPDATE语句
// 例如: UPDATE users SET name = 'John', age = 30 WHERE id = 1
func (p *Parser) parseUpdateStatement() (*ast.UpdateStatement, error) {
	stmt := &ast.UpdateStatement{
		Updates: make(map[string]ast.Expression),
	}

	// 跳过UPDATE关键字
	p.nextToken()

	// 解析表名
	if !p.currTokenIs(lexer.IDENTIFIER) {
		return nil, fmt.Errorf("期望表名，但得到%s", p.currToken.Literal)
	}
	stmt.TableName = p.currToken.Literal

	// 期望下一个Token是SET
	if !p.expectPeek(lexer.SET) {
		return nil, fmt.Errorf("期望SET，但得到%s", p.peekToken.Literal)
	}

	// 解析SET子句
	for {
		// 解析列名
		p.nextToken()
		if !p.currTokenIs(lexer.IDENTIFIER) {
			return nil, fmt.Errorf("期望列名，但得到%s", p.currToken.Literal)
		}
		colName := p.currToken.Literal

		// 期望下一个Token是等号
		if !p.expectPeek(lexer.EQUAL) {
			return nil, fmt.Errorf("期望=，但得到%s", p.peekToken.Literal)
		}

		// 解析值表达式
		p.nextToken()
		expr, err := p.parseExpression(LOWEST)
		if err != nil {
			return nil, err
		}
		stmt.Updates[colName] = expr

		// 如果下一个Token是逗号，继续解析下一个SET项
		if p.peekTokenIs(lexer.COMMA) {
			p.nextToken() // 跳过逗号
			continue
		}
		break
	}

	// 解析WHERE子句(可选)
	if p.peekTokenIs(lexer.WHERE) {
		p.nextToken() // 跳过当前token
		p.nextToken() // 跳过WHERE
		where, err := p.parseExpression(LOWEST)
		if err != nil {
			return nil, err
		}
		stmt.Where = where
	}

	// 检查下一个token是否是分号(作为SQL语句结束标记)
	if p.peekTokenIs(lexer.SEMICOLON) {
		p.nextToken() // 消费分号，确认语句结束
	}
	// 如果没有分号，也允许语句结束（某些SQL环境中分号是可选的）

	return stmt, nil
}
